#include "comm.hpp"

// server端进行创建和删除共享内存

int main()
{
    // 创建
    key_t k = getKey();
    printf("key:0x%x\n", k);
    int shmid = createShm(k);
    printf("shmid:%d\n", shmid);
    
    //sleep(5);
    
    // 挂接
    // 这里为啥用start命名呢？
    // 因为挂接成功后返回的是进程地址空间的起始地址
    // 进一步加深先描述再组织的概念
    // OS不会直接让用户直接对共享内存进行操作，
    // 要先管理进进程地址空间中 
    char *start = (char*)attachShm(shmid);
    printf("attach success,address start:%p\n",start);

    //sleep(5);

    //通信
    while(true)
    {
        //直接从start中读取数据
        printf("client say:%s\n",start);
        struct shmid_ds ds;
        shmctl(shmid, IPC_STAT, &ds);
        printf("获取属性: size: %d, pid: %d, myself: %d, key: 0x%x",\
                ds.shm_segsz, ds.shm_cpid, getpid(), ds.shm_perm.__key);
        sleep(1);
    }

    // 去关联
    detachShm(start);

    sleep(10);

    // 删除共享内存
    delShm(shmid);
    return 0;
}